package com.demo.采用预编译数据库操作对象;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
 * 解决登录验证系统的bug。
 */
public class 解决sql注入问题 {
    public static void main(String[] args) {

        //初始化一个界面
        Map<String,String> IU=initUI();
        //验证用户名和密码
        boolean booleanSuccess= login(IU);
        //最后输出结果
        if (booleanSuccess ) {
            System.out.println("登录成功！");
        }else{
            System.out.println("登录失败！");
        }
    }

    /**
     * 验证用户名和密码的具体方法
     * @param iu=true，表示登录成功，否则登录失败
     * @return
     */
    private static boolean login(Map<String, String> iu) {
        //打标记点
        boolean isFlag=false;
        //JDBC代码
        //单独定义变量
        String lgName=iu.get("loginName");
        String lgPwd=iu.get("loginPwd");

        Connection con=null;
        PreparedStatement sta=null;//使用预编译操作数据库对象
        ResultSet rs=null;
        try{
            //注册驱动

//            Driver driver=new com.mysql.cj.jdbc.Driver();//MySQL8.0.23的注册方法，从包名开始创建一个Driver实现类的对象
//
//            DriverManager.registerDriver(driver);
            Class.forName("com.mysql.cj.jdbc.Driver");


            //获取数据库链接对象
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/xclmf","root","552200");
            System.out.println("连接数据库成功："+con);
            //获取数据库操作对象
                //先将sql语句写在前面，而且使用占位符？先代替用户输入的数据
            String sql="select * from t_user where realName = ? and loginPwd=?";

                //使用预编译的创建操作数据库对象的方法
            sta=con.prepareStatement(sql);

            //执行sql语句
                //给占位符赋值。（第一个问号下标为：1，第二个问号为：2）JDBC中下标都是从1开始。
            sta.setString(1,lgName);
            sta.setString(2,lgPwd);

            rs=sta.executeQuery();//直接调用就行

            //处理sql查询结果集
            if (rs.next()) {
                isFlag=true;
            }

        }catch (Exception e){
            System.out.println("代码出错！");
        }finally {
            //释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (sta != null) {
                try {
                    sta.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }

        }
        return isFlag;
    }


    /**
     * 初始化一个界面的具体方法
     * 用户输入用户名和密码
     * @return
     */
    private static Map<String, String> initUI() {
        Scanner s=new Scanner(System.in);

        System.out.print("请输入用户名(字符串型数据)：");
        String loginName=s.nextLine();

        System.out.print("请输入你的密码(整型数据)：");
        String loginPwd=s.nextLine();


        Map<String,String> IU=new HashMap<>();
        IU.put("loginName",loginName);
        IU.put("loginPwd",loginPwd);
        return IU;
    }
}